/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.components;

/**
 *
 * @author Jurguen
 */
import com.tida.servir.entities.DatoAuxiliar;
import com.tida.servir.entities.Funcionario;
import com.tida.servir.entities.LkBusquedaFuncionario;
import com.tida.servir.entities.LkBusquedaTrabajadorAuto;
import com.tida.servir.entities.LkDocumentoIdentidad;
import com.tida.servir.entities.Usuario;
import com.tida.servir.services.GenericSelectModel;
import helpers.Helpers;
import helpers.ServicioReniec;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.FieldValidatorSource;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class ComponenteFuncionario {

    @Parameter
    private Zone _zone;
    @Parameter
    private Zone _zoneOtro;
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    @Property
    private String _zoneName;
    @Parameter(defaultPrefix = BindingConstants.LITERAL)
    @Property
    private String _zoneNameOtro;
    @Parameter(required = true)
    private Funcionario funcionarioComponente;
    @Parameter(value = "false")
    private Boolean esEntidadExterna;
    @Inject
    private Session session;
    @SessionState
    private Usuario _usuario;
    @Property
    @Persist
    private Boolean mostrarnuevof;
    @Property
    @Persist
    private Boolean mostrarautoridad;
    private int elemento = 0;
    @Property
    @Persist
    private Boolean mostrarlista;
    @Property
    @Persist
    private Boolean guardarFuncionario;
    @Property
    @Persist
    private int maxlength;
    @Persist 
    private String regeVali;
    @InjectComponent 
    private TextField autoridad_nrodocumento; 
    @Inject 
    private FieldValidatorSource fieldValidatorSource; 
    @Property
    @Persist
    private Boolean buscarReniec;
    @Property
    @Persist
    private Boolean ingresaDI;
    @Property
    @Persist
    private Boolean buscaReniec;
    @Property
    @Persist
    private String bnomautoridad;
    @Persist
    @Property
    private String nroautoridad;
    @Property
    @Persist
    private Boolean autoridad;
    @Property
    @Persist
    private Funcionario nuevofuncionario;
    @Inject
    private PropertyAccess _access;
    @Persist
    @Property
    private Boolean veditar;
    @Persist
    @Property
    private Boolean veditarCargo;
    @InjectComponent
    private Zone autoridadmodalZone;
    @Component(id = "formulariomensajespi")
    private Form formulariomensajespi;
    @InjectComponent
    private Zone mensajesPIZone;
    @Property
    @Persist
    private LkBusquedaFuncionario bfuncionario;

    // inicio de la pagina
    @Log
    @SetupRender
    void inicio() {
        mostrarlista = false;
        mostrarnuevof = false;
        autoridad = false;
        regeVali="";
        buscaReniec = false; // Para habilitar el boton de buscar en reniec
        buscarReniec = false; // Para controlar si realizó una búsqueda en reniec
        //onResetNuevo();
    }

    @Log
    public List<LkBusquedaFuncionario> getFuncionarios() {
        Criteria c = session.createCriteria(LkBusquedaFuncionario.class);
        c.add(Restrictions.eq("flg_usuario", false));
        if (bnomautoridad != null) {
            c.add(Restrictions.disjunction().add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad.replaceAll("ñ", "n") + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario", "%" + bnomautoridad.replaceAll("n", "ñ") + "%").ignoreCase()));
        }
        nroautoridad = Integer.toString(c.list().size());
        return c.list();
    }

    @Log
    Object onActionFromSeleccionaFuncionario(LkBusquedaFuncionario fun) {
        Funcionario sele = new Funcionario();
        sele = (Funcionario) session.load(Funcionario.class, fun.getId());
        funcionarioComponente = sele;
        return new MultiZoneUpdate(_zoneName, _zone.getBody()).add(_zoneNameOtro, _zoneOtro.getBody());
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidadauto() {
        List<DatoAuxiliar> list;
        if (_usuario.getRolid() <= 2) {
            list = Helpers.getDatoAuxiliarLista("DOCUMENTOIDENTIDAD", 1L, session);
        } else {
            list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
        }
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "abrev", "id", _access);
    }
    
    

    @Log
    void onSelectedFromNuevautoridad() {
        elemento = 4;
    }

    @Log
    Object onSuccessFromformbusquedaautoridad() {
        if (elemento == 4) {
            onResetNuevo();
        } else {
            mostrarlista = true;
        }
        return autoridadmodalZone.getBody();
    }

    @Log
    Object onCancelNuevo() {
        mostrarnuevof = false;
        return autoridadmodalZone.getBody();
    }

    @Log
    Object onResetNuevo() {
        mostrarnuevof = true;
        mostrarautoridad = false;
        ingresaDI = false;
        veditar = true;
        veditarCargo = true;
        guardarFuncionario = false;
        nuevofuncionario = new Funcionario();
        formulariomensajespi.clearErrors();
        if (_usuario.getRolid() > 2 && esEntidadExterna) {
            veditar = false;
            guardarFuncionario = true;
            veditarCargo = false;
        }
        return autoridadmodalZone.getBody();
    }

    @Log
    void onSelectedFromBuscarReniec() {
        buscarReniec = true;
        veditarCargo = false;
    }

    @Log
    @CommitAfter
    Object onSuccessFromformnuevaautoridad() {
        Boolean validaDocumento = true;
        formulariomensajespi.clearErrors();
        if (_usuario.getRolid() > 2 && esEntidadExterna) {
            validaDocumento = false;
        }

        if (validaDocumento || buscaReniec) {
            if (nuevofuncionario.getDocumentoidentidad() == null) {
                formulariomensajespi.recordError("Ingrese tipo de documento de identidad.");
                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
            if (nuevofuncionario.getNroDocumento() == null) {
                formulariomensajespi.recordError("Ingrese número de documento de identidad.");
                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
            if (nuevofuncionario.getNroDocumento().trim().equals("")) {
                formulariomensajespi.recordError("Ingrese número de documento de identidad.");
                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
            if (nuevofuncionario.getDocumentoidentidad().getCodigo() == 1) {
                if (nuevofuncionario.getNroDocumento().length() < 8 || nuevofuncionario.getNroDocumento().length() > 8) {
                    formulariomensajespi.recordError("El número de documento debe tener 8 dígitos.");
                    return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
                }
            }
        }

        if (buscarReniec) {
            nuevofuncionario.setApellidoPaterno("ZAMBRANO");
            nuevofuncionario.setApellidoMaterno("MORENO");
            nuevofuncionario.setNombres("JURGUEN MIGUEL");
            guardarFuncionario = true;
            ingresaDI = true;
            buscarReniec = false;

            // BUSQUEDA EN EL WEB SERVICE
//        try {
//            ServicioReniec treniec = new ServicioReniec();
//            treniec.obtenerToken();
//            if (treniec.validarToken(session) == true) {
//                System.out.println("BUSCAR DNI");
//                //  Buscamos DNI
//                List<String> result = treniec.obtenerResultado(nuevofuncionario.getNroDocumento());
//
//                // DISMINUCION DE NRO DE PETICIONES
//                //_usuario.getEntidad().setPeticiones_ws_Reniec(_usuario.getEntidad().getPeticiones_ws_Reniec()-1);
//                //session.saveOrUpdate(_usuario.getEntidad());                    
//                //parametro.setNroConsultasActuales(parametro.getNroConsultasActuales()-1);
//                //session.saveOrUpdate(parametro);
//
//                if (treniec.validarEstadoConsulta(result.get(0), session) == true) {
////                    // VALIDACIONES PRE CARGA DE LA ENTIDAD 
////                    Date fechaInicial, fechaWS;
////                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
////                    fechaInicial = formatoFecha.parse(fechacaducidad);
////                    System.out.println("EXC " + result.get(1) + result.get(18) + result.get(14));
////
////                    if (!result.get(18).equals("")) {
////                        // validacion si la persona no tiene fecha de caducidad (si ha fallecido la persona)
////                        formatoFecha = new SimpleDateFormat("yyyyMMdd");
////                        fechaWS = formatoFecha.parse(result.get(18));
////                        System.out.println("EXC " + fechaInicial);
////                        System.out.println("EXC " + fechaWS);
////
////                        if (!fechaInicial.equals(fechaWS)) {
////                            //formulariomensajes.recordError("Fecha de Caducidad Incorrecta"); // MENSAJES DE ERROR                         
////                            return autoridadmodalZone.getBody();
////                        }
////                    } else {
////                        //formulariomensajes.recordError("No se puede registrar a una persona que ha fallecido"); // MENSAJES DE ERROR                         
////                        return autoridadmodalZone.getBody();
////                    }
//
//                    nuevofuncionario.setApellidoPaterno(result.get(1));
//                    nuevofuncionario.setApellidoMaterno(result.get(2));
//                    nuevofuncionario.setNombres(result.get(4));
//                    System.out.println("Paterno : "+result.get(1));
//                    System.out.println("Materno : "+result.get(2));
//                    System.out.println("Nombre : "+result.get(4));
//                } else {
//                    //formulariomensajes.recordError(treniec.mensajeError); // MENSAJES DE ERROR EN CONSULTA
//                    System.out.println(treniec.mensajeError);
//                    //return autoridadmodalZone.getBody();
//                }
//            } else {
//                //formulariomensajes.recordError(treniec.mensajeError); // MENSAJES DE ERROR TOKEN 
//                System.out.println(treniec.mensajeError);
//                //return autoridadmodalZone.getBody();
//            }
//
//        } catch (Exception ex) {
//            System.out.println(ex.toString());
//        }
            // guardarFuncionario = true;
            // ingresaDI = true;
        } else {
            formulariomensajespi.clearErrors();
            Criteria c = session.createCriteria(LkBusquedaFuncionario.class);
            c.add(Restrictions.eq("nroDocumento", nuevofuncionario.getNroDocumento()));
            if (!c.list().isEmpty()) {
                formulariomensajespi.recordError("Ya existe un funcionario registrado con el número de documento ingresado.");
                return new MultiZoneUpdate("mensajesPIZone", mensajesPIZone.getBody()).add("autoridadmodalZone", autoridadmodalZone.getBody());
            }
            bnomautoridad = nuevofuncionario.getApellidoPaterno() + ' ' + nuevofuncionario.getApellidoMaterno() + ' ' + nuevofuncionario.getNombres();
            nuevofuncionario.setFlg_usuario(false);
            session.saveOrUpdate(nuevofuncionario);
            session.flush();
            nuevofuncionario = new Funcionario();
            mostrarnuevof = false;
            mostrarlista = true;
            mostrarnuevof = false;
        }
        return autoridadmodalZone.getBody();
    }
    
     public org.apache.tapestry5.FieldValidator getValidator() {
        //return new FieldValidator().getValidator(nrodocumento, regeVali);
            return fieldValidatorSource.createValidators(autoridad_nrodocumento, regeVali); 
    }
    

    @Log
    Object onValueChangedFromDocumentoIdentidad(DatoAuxiliar dato) {
        if (dato != null) {
            if (dato.getCodigo() == 1) {
                veditar = true;
                buscaReniec = true;
                guardarFuncionario = false;
//                veditarCargo = true;
                regeVali="required,regexp=^[0-9]{8}$";
                maxlength=8;
            } else {
                veditar = false;
                veditarCargo=false;
                buscaReniec = false;
                guardarFuncionario = true;
//                veditarCargo = false;
                buscarReniec = false;
                regeVali="required,regexp=^[a-zA-Z0-9]{12}$";
                maxlength=12;
            }
        } else {
            veditar = false;
            buscaReniec = false;
            guardarFuncionario = true;
            buscarReniec = false;
            
            regeVali="";
            maxlength=12;
        }

        return autoridadmodalZone.getBody();
    }
}